ParsecT s u m aモナド
ParsecT s u m aの各パラメータの意味を理解するときに、
一文字ずつではなく、ParsecTその型定義を見てから、塊として理解したほうがいい
型
code:hs
newtype ParsecT s u m a
= ParsecT {unParser :: forall b .
State s u
-> (a -> State s u -> ParseError -> m b) -- consumed ok
-> (ParseError -> m b) -- consumed err
-> (a -> State s u -> ParseError -> m b) -- empty ok
-> (ParseError -> m b) -- empty err
-> m b
}
簡略化すると
ParsecT { unParser = \s cok cerr eok eerr -> m b }
s
後述するState s u
4つの関数
これらは全て返り値はm b
cok
マッチが成功して文字列の消費が起きる場合
cerr
マッチが失敗するが文字列の消費が起きる場合
eok
マッチが成功するが文字列の消費が起きない
eerr
マッチが失敗して文字列の消費も起こらない
State s u型
parserの状態となる型
「パーサ状態」と呼ぶ
3つの状態を保持する
parserInput :: s
パーサへの入力文字列
statePos :: !SourcePos
パーサ状態の位置
stateUser :: !u
ユーザが使用するユーザ状態
参考
わかりやすい
m
内部のモナド
殆どの場合はIdentityで事足りる
なのでParsec s u aが用意されている
type Parsec e s a = ParsecT e s Identity a
a
パース結果であるモナディック値
参考